/*
 * LibMediaDecoder.h
 *
 *  Created on: 2018年7月30日
 *      Author: terry
 */

#ifndef LIBMEDIADECODER_H_
#define LIBMEDIADECODER_H_

///////////////////////////////////////////////////////////////////
#ifdef WIN32

    #ifndef NOMINMAX
    #define NOMINMAX
    #endif //NOMINMAX

    //#pragma warning( disable : 4786 )
    #include <winsock2.h>
    //#include <windows.h>

#else


#endif //WIN32


///////////////////////////////////////////////////////////////////
#include <stddef.h>
#include <string.h>
///////////////////////////////////////////////////////////////////

#ifndef SOCKET_T
    #ifdef WIN32
        typedef SOCKET  socket_t;
    #else
        typedef int     socket_t;
    #endif // WIN32

    #define SOCKET_T

#endif //SOCKET_T



#ifdef _MSC_VER
#if (_MSC_VER >= 1700)
    #include <stdint.h>
#else
    typedef signed char     int8_t;
    typedef unsigned char   uint8_t;
    typedef short           int16_t;
    typedef unsigned short  uint16_t;
    typedef int             int32_t;
    typedef unsigned        uint32_t;
    typedef long long       int64_t;
    typedef unsigned long long   uint64_t;
#endif

#else
    #include <stdint.h>
#endif //_MSC_VER


///////////////////////////////////////////////////////////////////
#ifdef WIN32
    #ifndef DLLEXPORT
    #define DLLEXPORT __declspec(dllexport)
    #endif //DLLEXPORT
#else
    #ifndef DLLEXPORT
    #define DLLEXPORT __attribute__ ((visibility ("default")))
    #endif //DLLEXPORT
#endif //WIN32

///////////////////////////////////////////////////////////////////

#ifdef WIN32
#else
    typedef void*   HANDLE;
    typedef int     BOOL;
    typedef void*	HWND;
    typedef void*	HDC;

	#define WINAPI

#endif //


/////////////////////////////////////////////////////////////////////////////
#ifdef __cplusplus
extern "C"
{
#endif

/////////////////////////////////////////////////////////////////////////////


///上报资源信息
struct ResNode
{
    char    id[MAX_ID];        /// 统一资源编码（摄像头或目录结构）
    char    name[MAX_NAME];    /// 资源名称
    char    parentID[MAX_ID];  /// 资源父节点的统一资源编码
    int     subNum;            /// 子节点数目
    int     codec;             /// 解码标签
    double  longitude;         /// 经度
    double  latitude;          /// 纬度
    int     seq;               /// 序号，在该目录层次中的序号，从0开始编码
    int     status;            /// 状态，0不可用，1可用
    int     hasPTZ;            /// 是否支持PTZ
    int     resType;           /// 资源类型，0是目录，1是其它
    char    desc[MAX_NAME];  /// 资源父节点的统一资源编码
};


///云镜控制动作
enum PTZCommand
{
    PTZ_CMD_START   = 0,   ///无意义
    PTZ_CMD_STOP    = 1,   ///停止

    PTZ_CMD_RIGHT   = 2,   ///右
    PTZ_CMD_LEFT    = 4,   ///左
    PTZ_CMD_DOWN    = 6,   ///下
    PTZ_CMD_UP      = 8,   ///上

    PTZ_CMD_SMALL   = 10,    ///光圈变小
    PTZ_CMD_LARGE   = 12,    ///光圈变大

    PTZ_CMD_ZOOM_IN  = 14,   ///焦距变大
    PTZ_CMD_ZOOM_OUT = 16,   ///焦距变小

    PTZ_CMD_FOCUS_IN  = 18,  ///焦点前调
    PTZ_CMD_FOCUS_OUT = 20,  ///焦点后调

    PTZ_CMD_ASSIST_FUNC_1 = 30,  ///雨刷
    PTZ_CMD_ASSIST_FUNC_2 = 32,  ///辅佐开关2
    PTZ_CMD_ASSIST_FUNC_3 = 34,  ///辅佐开关3
    PTZ_CMD_ASSIST_FUNC_4 = 36,  ///辅佐开关4

    PTZ_RIGHT_APPLY   = 40,    ///权限申请
    PTZ_RIGHT_RELEASE = 42,    ///权限释放

    PTZ_PRESET_ADD    = 110,   ///添加预置位
    PTZ_PRESET_MODIDY = 112,   ///修改预置位
    PTZ_PRESET_DELETE = 114,   ///删除预置位
    PTZ_PRESET_GOTO   = 116,   ///转到预置位

    PTZ_CMD_SCAN = 120,        ///自动扫描开
    PTZ_CMD_LENGTH
};


/**
 * OCX 仅显示播放窗口. 单个窗口.
 * 可在实时播放/远程回放/本地回放之间切换.
 */





/**
 * 初始化
 * @return
 */
bool Init();

/**
 * 清理
 */
void Uninit();

/**
 * 获取版本
 * @return
 */
const char* GetVersion();


/// 登录登出
/**
 * 登录
 * @param ip        服务器IP地址
 * @param port      服务器端口
 * @param username  用户名
 * @param password  用户密码
 * @return
 */
bool Login(const char* ip, int port, const char* username, const char* password);

/**
 * 登出
 */
void Logout();

/**
 * 是否登录进系统
 * @return
 */
bool IsLogin();

/**
 * 设置配置参数
 * @param name      名称
 * @param value     值
 * @return
 */
bool SetParam(const char* name, const char* value);


/// PTZ 控制

/**
 * 控制云镜
 * @param id    设备ID
 * @param cmd   命令
 * @param speed 速度
 * @param data  附加数据
 * @return
 */
bool ControlPtz(const char* id, int cmd, int speed, int data);


/// 实时预览

/**
 * 开始预览
 * @param id    设备ID
 * @return
 */
HANDLE StartPreview(const char* id);



/// 回放
/**
 * 回放服务器端录像
 * @param id        设备ID
 * @param startTime 开始时间
 * @param duration  时长
 * @return
 */
HANDLE StartPlayback(const char* id, time_t startTime, int duration);



/// 停止预览/回放
void Stop(HANDLE handle);


/// 暂停/恢复
bool Pause(HANDLE handle, bool toPause);

/// 设置倍速
bool SetScale(HANDLE handle, double scale);

/// 获取媒体时长
int64_t GetDuration(HANDLE handle);

/// 获取当前播放时间
int64_t GetTime(HANDLE handle);

/// 拖拽到指定位置
bool Seek(HANDLE handle, int64_t pts);


/// 抓图
bool Snap(HANDLE handle, const char* filepath);

/// 设置音量
bool SetVolume(HANDLE handle, int volume);

/// 获取音量
int GetVolume(HANDLE handle);

/// 设置显示比例
bool SetRatio(HANDLE handle, int cx, int cy);

/// 打开声音
bool OpenSound(HANDLE handle);

/// 关闭声音
bool CloseSound(HANDLE handle);


/**
 * 回放网络文件或者本地文件
 * @param url       文件路径
 * @param params    附加参数, 默认为空
 * @return
 */
HANDLE StartPlayFile(const char* url, const char* params);



/**
 * 开始下载
 * @param id    设备ID
 * @param startTime 起始时间
 * @param duration  时长
 * @param filepath  文件路径
 * @return
 */
HANDLE DownloadStart(const char* id, time_t startTime, int duration, const char* filepath);

/**
 * 获取下载的字节数
 * @param handle
 * @return
 */
int64_t DownloadGetBytes(HANDLE handle);

/**
 * 停止/关闭下载
 * @param handle
 */
void DownloadStop(HANDLE handle);


/// 通知回调

/// 流状态
typedef (*StreamStatusSink)(HANDLE handle, int status);

/// 下载任务
typedef (*DownloadStatusSink)(HANDLE handle, int status);

/// 用户连接状态
typedef (*ConnectionStatusSink)(int status);


/**
 * 设置连接状态通知回调
 * @param sink
 */
void SetConnectionStatusSink(ConnectionStatusSink sink);


/**
 * 设置下载通知回调
 * @param sink
 */
void SetDownloadStatusSink(DownloadStatusSink sink);

/**
 * 设置流状态回调
 * @param sink
 */
void SetStreamStatusSink(StreamStatusSink sink);




/////////////////////////////////////////////////////////////////////////////

#ifdef __cplusplus
}
#endif

#endif /* LIBMEDIADECODER_H_ */
